Houdini数学 : 円と線分の接触判定
円と線分の接触判定を行うVEXを紹介します。
ネットワーク全体
線分に接触している円は赤く、それ以外は白く表示させてみました。
https://gyazo.com/c8b3b92b6c73f75eb593b0474e732a3c
ノードの解説
■Addノード(円の中心の追加)
左側のAddノードでは円の中心となる点を追加します。
https://gyazo.com/349d93e692501fc30b54f77f4ccb4d5a
■Addノード(線分の端点の追加)
右側のAddノードでは、線分の両端の点を追加します。
https://gyazo.com/9e0e9c091ba41be5c750d777b7a0e65c
■Attribute Wrangleノード(円と線分の接触判定)
Attribute Wrangleノードでは、円と線分の接触判定を行います。
接触しているものに対しては @Cdアトリビュートに赤色を設定します。
https://gyazo.com/dd0b1f08e96c88b656ba9eebef02c998
code:VEC(c)
vector l0 = point(@OpInput2, "P", 0);
vector l1 = point(@OpInput2, "P", 1);
vector l = normalize(l1 - l0); // 直線に沿うベクトル
vector p = @P - l0; // 直線の開始点と点Pを結ぶ線分
float k = dot(l, p) / dot(l, l); // 垂線の足までの長さ
k = clamp(k, 0, length(l1 - l0)); // 垂線の足が線分の外に出ないようにする
vector h = p - k * l; // 垂線(点Pと垂線の足を結ぶ直線)
float distance = length(h); // 点と直線の距離
if (distance < chf("radius")) // 垂線が円の半径より短いなら接触
{
// 接触しているなら赤くする
@Cd = {1, 0, 0};
}
■Circleノード
半径1の円を表示します。
https://gyazo.com/342e7a489736cc12075ab1ef443101b3
■CopyToPointsノード(円の表示)
点に対してCircleノードをコピーして、円を表示します。
https://gyazo.com/6926b518d03a93e0243319fe412d5a77
■Mergeノード
線分と円を合体します。
https://gyazo.com/eb6bed698a3aff40a9f93f2554e8ad15
関連